﻿#region Using

using System;
using SAPbouiCOM;
using SapFramework.Interface.Events;

using Form = SapFramework.Interface.Controls.Forms.Base.Form;
using Item = SapFramework.Interface.Controls.Items.Base.Item;

#endregion

namespace SapFramework.Interface.Controls.Items.Specific
{
    /// <summary>
    /// Realiza o encapsulamento de um objeto do tipo <see cref="SAPbouiCOM.EditText"/>, mas com área de texto expansível, da UI API do SAP Business One.
    /// </summary>
    public sealed class ExtendedEditText : Item, SAPbouiCOM.EditText
    {
        #region Eventos

        /// <summary>
        /// Evento disparado quando o botão principal do mouse foi clicado duas vezes sobre um item, mas nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_DOUBLE_CLICK )]
        public event EventBoolItem OnBeforeDoubleClick;

        /// <summary>
        /// Evento disparado quando o botão principal do mouse foi clicado duas vezes sobre um item, e qualquer ação do SBO já foi realizada.
        /// </summary>
        [Event( BoEventTypes.et_DOUBLE_CLICK )]
        public event EventVoidItem OnAfterDoubleClick;

        /// <summary>
        /// Evento disparado quando o botão do mouse foi liberado em cima de um item, ou seja, quando o botão do mouse está em cima, mas nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_ITEM_PRESSED )]
        public event EventBoolItem OnBeforeItemPressed;

        /// <summary>
        /// Evento disparado quando o botão do mouse foi liberado em cima de um item, ou seja, quando o botão do mouse está em cima, e qualquer ação do SBO já foi realizada.
        /// </summary>
        [Event( BoEventTypes.et_ITEM_PRESSED )]
        public event EventVoidItem OnAfterItemPressed;

        /// <summary>
        /// Ocorre depois que o item recebe o foco.
        /// </summary>
        [Event( BoEventTypes.et_GOT_FOCUS )]
        public event EventVoidItem OnGotFocus;

        /// <summary>
        /// Ocorre depois que o item perde o foco.
        /// </summary>
        [Event( BoEventTypes.et_LOST_FOCUS )]
        public event EventVoidItem OnLostFocus;

        /// <summary>
        /// Eventos que ocorre quando um item perdeu o fóco e a validação é obrigatória para ele, mas ainda não ocorreu.
        /// </summary>
        [Event( BoEventTypes.et_VALIDATE )]
        public event EventBoolItem OnBeforeValidate;

        /// <summary>
        /// Eventos que ocorre quando um item perdeu o fóco e a validação é obrigatória para ele, e esta validação já ocorreu.
        /// </summary>
        [Event( BoEventTypes.et_VALIDATE )]
        public event EventVoidItem OnAfterValidate;

        /// <summary>
        /// Evento que ocorre quando um botão de ChooseFromList foi clicado, mas ela ainda não foi invocada.
        /// </summary>
        [Event( BoEventTypes.et_CHOOSE_FROM_LIST )]
        public event EventBoolChooseFromList OnBeforeChooseFromList;

        /// <summary>
        /// Evento que ocorre quando um botão de ChooseFromList foi clicado, e ela já está a mostra.
        /// </summary>
        [Event( BoEventTypes.et_CHOOSE_FROM_LIST )]
        public event EventVoidChooseFromList OnAfterChooseFromList;

        /// <summary>
        /// Ocorre quando uma tecla for pressionado sobre a EditText, porém nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_KEY_DOWN )]
        public event EventBoolItem OnBeforeKeyDown;

        /// <summary>
        /// Ocorre quando uma tecla for pressionado sobre a EditText, e qualquer ação do SBO já foi executada.
        /// </summary>
        [Event( BoEventTypes.et_KEY_DOWN )]
        public event EventVoidItem OnAfterKeyDown;

        /// <summary>
        /// Disparado antes da exibição do menu que ocorre quando um clique com o botão direito do mouse é feito sobre um item.
        /// </summary>
        [Event( BoEventTypes.et_RIGHT_CLICK )]
        public event EventBoolContextMenu OnBeforeRightClick;

        /// <summary>
        /// Disparado após a exibição do menu que ocorre quando um clique com o botão direito do mouse é feito sobre um item.
        /// </summary>
        [Event( BoEventTypes.et_RIGHT_CLICK )]
        public event EventVoidContextMenu OnAfterRightClick;

        #endregion

        /// <summary>
        /// Guarda uma referencia para a parte específica do item
        /// </summary>
        private readonly SAPbouiCOM.EditText mEditText;

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="aForm">O formulário ao qual o item pertence</param>
        /// <param name="aItemUniqueId">Id único do Item do Form do SAP Business One</param>
        public ExtendedEditText( Form aForm, string aItemUniqueId ) : base( aForm, aItemUniqueId, BoFormItemTypes.it_EXTEDIT )
        {
            mEditText = mItem.Specific as SAPbouiCOM.EditText;
        }

        #region Implementation of IEditText

        /// <summary>
        /// Simula um click do usuário, com o botão principal do mouse, sobre o ícone do picker (bolinha, calculadora etc...), 
        /// setando o fóco no EditText e abrindo o formulário do picker em questão.
        /// Simulates a user click (main mouse button) on an icon to open a picker, setting the focus on the item and opening the picker form.
        /// </summary>
        /// <exception cref="Exception">
        /// Se o item não tiver um picker associado, uma exceção é gerada.
        /// </exception>
        public void ClickPicker()
        {
            mEditText.ClickPicker();
        }

        /// <summary>
        /// O texto mostrado na caixa de texto do objeto.
        /// </summary>
        /// <remarks>
        /// O valor apresentado em <see cref="Value"/> é o valor real, disponibilizado no formato de uma string, com o comando <see cref="object.ToString"/>
        /// A propriedade <see cref="String"/> retorna o texto mostrado na caixa de texto do objeto.
        /// <example>
        /// O valor representado pelo valor monetário 12.5 no campo <see cref="Value"/> é demostrado no campo <see cref="String"/> como 12,50.
        /// </example>
        /// </remarks>
        public string String
        {
            get { return mEditText.String; }
            set { mEditText.String = value; }
        }

        /// <summary>
        /// Indica quando o EditText deve esconder os zeros a esquerda da parte inteira e a direita da parte decimal.
        /// </summary>
        public bool SuppressZeros
        {
            get { return mEditText.SuppressZeros; }
            set { mEditText.SuppressZeros = value; }
        }

        /// <summary>
        /// Referência para o objeto <see cref="DataBind"/>, que realiza uma ligação com um:
        /// <list type="bullet">
        /// <see cref="UserDataSource"/>
        /// <see cref="DBDataSource"/>
        /// <see cref="DataTable"/>
        /// </list>
        /// </summary>
        /// <see cref="DataBind"/>
        public DataBind DataBind
        {
            get { return mEditText.DataBind; }
        }

        /// <summary>
        /// O valor associado à EditText, disponibilizado em forma de <see cref="string"/>, possivelmente com o comando <see cref="object.ToString"/>.
        /// </summary>
        /// <see cref="String"/>
        public string Value
        {
            get { return mEditText.Value; }
            set { mEditText.Value = value; }
        }

        /// <summary>
        /// Indica se este componente possui uma barra de rolagem.
        /// </summary>
        /// <remarks>
        /// Os tipos disponiveis estão em <see cref="BoScrollBars"/>
        /// </remarks>
        public BoScrollBars ScrollBars
        {
            get { return mEditText.ScrollBars; }
            set { mEditText.ScrollBars = value; }
        }

        /// <summary>
        /// O Id único do objeto <see cref="ChooseFromList"/> associado ao EditText.
        /// </summary>
        /// <remarks>
        /// Para que funcione corretamente, este campo deve estar associado a um objeto <see cref="DataBind"/> do tipo <see cref="BoDataType.dt_SHORT_TEXT"/>
        /// 
        /// Séte esta propriedade antes de setar a propriedade <see cref="ChooseFromListAlias"/>
        /// </remarks>
        public string ChooseFromListUID
        {
            get { return mEditText.ChooseFromListUID; }
            set { mEditText.ChooseFromListUID = value; }
        }

        /// <summary>
        /// O campo database pelo qual se deve filtrar a <see cref="ChooseFromList"/> associada ao EditText.
        /// </summary>
        /// <remarks>
        /// Quando o usuário insere um valor na caixa de texto e pressiona a tecla Tab, a caixa de dialogo da <see cref="ChooseFromList"/> 
        /// é mostrada com apenas as linhas que começam com o valor especificado no campo.
        /// 
        /// <example>
        /// Caso a propriedade <see cref="ChooseFromListAlias"/> esteja apontada para o campo CardCode do Business Partner (Parceiro de negócio),
        /// caso o usuário insira o valor "A", apenas Business Partners cujo CardCode comecem com a letra A irão aparecer na caixa de dialogo da <see cref="ChooseFromList"/>.
        /// O mesmo aconteceria caso o campo apontado fosse CardName, onde neste caso, traria apenas os Business Partners cujo nome começasse com a letra "A".
        /// </example>
        /// 
        /// Em ambos os casos, após o usuário selecionar umas das linhas, o valor retornado será o presente no campo apontado por <see cref="ChooseFromListAlias"/>.
        /// </remarks>        
        public string ChooseFromListAlias
        {
            get { return mEditText.ChooseFromListAlias; }
            set { mEditText.ChooseFromListAlias = value; }
        }

        /// <summary>
        /// Indica se o EditText possuí o fóco. Quando setando, caso o valor seja <c>true</c>, coloca o fóco no item e 
        /// caso o valor seja <c>false</c> e o item se encontre atualmente focado, passa o fóco para o próximo item que pode obter o fóco..
        /// </summary>
        public bool Active
        {
            get { return mEditText.Active; }
            set { mEditText.Active = value; }
        }

        /// <summary>
        /// A ordem de tabulação do item
        /// </summary>
        public int TabOrder
        {
            get { return mEditText.TabOrder; }
            set { mEditText.TabOrder = value; }
        }

        /// <summary>
        /// O tipo de Picker do EditText
        /// </summary>
        /// <see cref="BoPickerType"/>
        public BoPickerType PickerType
        {
            get { return mEditText.PickerType; }
        }

        /// <summary>
        /// Informa se o EditText é utilizado para pedir por um Password
        /// </summary>
        /// <remarks>
        /// Caso seja <c>true</c>, então substitui as letras por * (asteriscos). 
        /// Se for <c>false</c>, então deixa o valor aparecendo normalmente.
        /// </remarks>
        public bool IsPassword
        {
            get { return mEditText.IsPassword; }
            set { mEditText.IsPassword = value; }
        }

        #endregion
    }
}